home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / utils / pcxutils / pcxview.c < prev    next >
C/C++ Source or Header  |  1993-07-14  |  3KB  |  159 lines

  1. /**************************************************************************
  2.  PCXVIEW - by Lee Hamel (Patch), hamell@cx.pdx.edu, *Avalanche* coder
  3.  July 14th, 1993
  4. **************************************************************************/
  5.  
  6. #include <stdio.h>
  7.  
  8. typedef struct {
  9.         char    manufacturer;
  10.         char    version;
  11.         char    encoding;
  12.         char    bits_per_pixel;
  13.         int     xmin,ymin;
  14.         int     xmax,ymax;
  15.         int     hres;
  16.         int     vres;
  17.         char    palette[48];
  18.         char    reserved;
  19.         char    colour_planes;
  20.         int     bytes_per_line;
  21.         int     palette_type;
  22.         char    filler[58];
  23.            } PCXHEAD;
  24.  
  25. PCXHEAD header;
  26. unsigned int width,depth;
  27. unsigned int bytes;
  28. unsigned char palette[768];
  29. FILE *fp;
  30.  
  31. void Read_PCX_Line(unsigned int vidoffset)
  32. {
  33.   unsigned char c, run;
  34.   unsigned int n = 0;
  35.  
  36.   _asm
  37.   {
  38.     cld
  39.     mov         di,[vidoffset]
  40.   }
  41.  
  42.   do
  43.   {
  44.     c = fgetc(fp) & 0xff;
  45.     /* if it's a run of bytes field */
  46.     if ((c & 0xc0) == 0xc0)
  47.     {
  48.       /* and off the high bits */
  49.       run = c & 0x3f;
  50.       /* get the run byte */
  51.       c = fgetc(fp);
  52.       /* run the byte */
  53.       n += run;
  54.       _asm
  55.       {
  56.     mov     ax,0a000h
  57.     mov     es,ax
  58.     mov     al,[c]
  59.     xor     ch,ch
  60.     mov     cl,[run]
  61.     rep     stosb
  62.       }
  63.     }
  64.     else
  65.     {
  66.       n++;
  67.       _asm
  68.       {
  69.     mov     ax,0a000h
  70.     mov     es,ax
  71.     mov     al,[c]
  72.     stosb
  73.       }
  74.     }
  75.   }
  76.   while (n < bytes);
  77. }
  78.  
  79. void Unpack_PCX_File(void)
  80. {
  81.   int i;
  82.  
  83.   for (i = 0; i < 768; i++)
  84.     palette[i] = palette[i] >> 2;
  85.  
  86.   _asm {        mov     ax,0013h
  87.         int     10h
  88.         mov     ax,1012h
  89.         xor     bx,bx
  90.         mov     cx,256
  91.         mov     dx,offset palette
  92.         int     10h
  93.        }
  94.  
  95.   /*
  96.   _asm {
  97.      cld
  98.      mov    ax,0a000h
  99.      mov    es,ax
  100.      xor    di,di
  101.      xor    al,al
  102.      mov    ah,200
  103.  
  104.      banger:        mov     cx,320
  105.             rep     stosb
  106.             inc     al
  107.             dec     ah
  108.             jnz     banger
  109.        }
  110.  */
  111.  
  112.   for (i = 0; i < depth; i++)
  113.     Read_PCX_Line(i * 320);
  114.  
  115.   _asm {        xor     ax,ax
  116.         int     16h
  117.         mov     ax,0003h
  118.         int     10h
  119.        }
  120. }
  121.  
  122. void main(int argc, char *argv[])
  123. {
  124.   if (argc > 1)
  125.   {
  126.     if ((fp = fopen(argv[1],"rb")) != NULL)
  127.     {
  128.       if (fread((char *)&header,1,sizeof(PCXHEAD),fp) == sizeof(PCXHEAD))
  129.       {
  130.     if (header.manufacturer == 0x0a && header.version == 5)
  131.     {
  132.       if (!fseek(fp,-769L,SEEK_END))
  133.       {
  134.         if (fgetc(fp) == 0x0c && fread(palette,1,768,fp) == 768)
  135.         {
  136.           fseek(fp,128L,SEEK_SET);
  137.           width = header.xmax - header.xmin + 1;
  138.           depth = header.ymax - header.ymin + 1;
  139.           bytes = header.bytes_per_line;
  140.           /*
  141.           printf("Width = %d\n",width);
  142.           printf("Depth = %d\n",depth);
  143.           printf("Bytes = %d\n",bytes);
  144.           */
  145.           Unpack_PCX_File();
  146.         }
  147.         else printf("Error reading palette\n");
  148.       }
  149.       else printf("Error seeking to palette\n");
  150.     }
  151.     else printf("Not a 256 color PCX file\n");
  152.       }
  153.       else printf("Error reading %s\n",argv[1]);
  154.       fclose(fp);
  155.     }
  156.     else printf("Error opening %s\n",argv[1]);
  157.   }
  158. }
  159.